Obtengo datos de una API, solo un objeto con valores numéricos relacionados con cada clave, y luego construyo una oración simple para mostrar los datos al usuario. Sin embargo, solo quiero incluir un valor de los datos si es mayor que 0. Aquí hay un ejemplo con datos simulados:
let data = {red: 100, blue: 200, yellow: 0, green: 400}; let resultsSentence = `We found ${data.red} red posts, ${data.blue} blue posts, and ${data.green} green posts.` console.log(resultsSentence) Como puede ver, dejé el amarillo fuera de la oración de resultados porque tiene un valor de 0 . Por supuesto, necesito poder generar esta oración dinámicamente en función de los datos que se devuelvan. Si uso condicionales, será un desastre, ya que hay demasiados escenarios posibles (escribir 15 declaraciones if/else no parece un buen enfoque).
¿Cómo puedo manejar esto? Necesito generar la oración en función de los valores que sean > 0 . Al principio pensé, fácil, simplemente insertaré todos los valores en una matriz, verificaré los 0 y eliminaré cualquier elemento que sea igual a 0 de la matriz. Luego, construya la oración en función de la longitud de la matriz, es decir, si la longitud de la matriz es 3 , entonces haga referencia a cada valor como array[0] , array[1] , array[2] . Sin embargo, esto presenta un problema, ya que necesito poder aclarar qué valores son cuáles en la oración. Por ejemplo, si elimino el yellow de la matriz, la longitud de la matriz será 3 , pero no sabré qué valor se eliminó.
¿Alguien puede ayudarme a encontrar una solución eficiente para esto?
Puede usar un bucle for..of simple para iterar sobre las claves y los valores del objeto, construyendo su cadena dentro de él.
Esto da como resultado una coma oxford , pero puede eliminarla en el condicional (donde elige usar and en su lugar).
let data = {red: 100, blue: 200, yellow: 0, green: 400}; let res = 'We found ' // Keep a record of how many keys we've processed so we know when we're at the end let i = 1 for (const [k, v] of Object.entries(data)) { // we could just continue early here, but we want to keep adding to `i` if (v > 0) { // This is the last key so use `and` not a comma if (i === Object.keys(data).length) { res += `and ${v} ${k} posts.` } else { res += `${v} ${k} posts, ` } } i++ } console.log(res)Prueba esto
let data = {red: 100, blue: 200, yellow: 0, green: 400}; let str = []; let len = Object.keys(data).length; Object.entries(data).forEach(([key, val], index) => { let isLast = (len - 1 == index) && str.length > 0; if(val > 0) str.push((isLast ? 'and ' : '') + `${val} ${key} posts`); }) let resultsSentence = 'We found ' + str.join(', ') console.log(resultsSentence)prueba esto (sin dependencias)
const keys = Object.keys(data) const values = Object.values(data) let string = 'we found' values.map((item, index)=>{ if(item > 0){ string += ` ${item} ${keys[index]} posts,` } }) console.log(string.slice(0,-1)+'.')prueba con lodash como
const _ = require('lodash') let data = {red: 100, blue: 200, yellow: 0, green: 400}; let string = 'we found' _.map(data,(value,key)=>{ if(value > 0){ string += ` ${value} ${key} posts,` } }) console.log(string.slice(0,-1)+'.')